home *** CD-ROM | disk | FTP | other *** search
- /*
- ** This file is for creating and using Finder clipping files. Note that the Finder gets
- ** pretty pissed if the clipping type is one other than it would create itself.
- **
- */
-
- #ifndef CLIPPINGFILE_H
- #include "ClippingFile.h"
- #endif
-
- #ifndef FLYPAPERUTILS_H
- #include "FlyPaperUtils.h"
- #endif
-
- #include "ST_MacClasses.h"
-
- #include <folders.h>
- #include <TextUtils.h>
-
- DragSendDataUPP gMySendDataProc;
-
- OSErr CreateClippingFile (short *fRefNum, OSType fileType, FlyPaperAuxDataHandle& auxData, ClippingID& clippingID)
- {
- ST_ResFileSaver resFileSaver (CurResFile ());
-
- *fRefNum = 0;
-
- static Boolean initedRandom = false;
- long dirID;
- short vRefNum;
- OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &vRefNum, &dirID);
-
- if (error)
- return error;
-
- if (!initedRandom) {
- GetDateTime ((unsigned long*) &qd.randSeed);
- initedRandom = true;
- }
-
- Str255 name;
- do {
- /* create a unique name */
- do {
- clippingID = ((long) Random () + ((long) Random () << 16)) & 0x7FFFFFFF;
- } while (clippingID < 256);
- NumToString (clippingID, name);
-
- error = HCreate (vRefNum, dirID, name, kClippingFileSignature, fileType);
-
- } while (error == dupFNErr);
-
- if (error)
- return error;
-
- HCreateResFile (vRefNum, dirID, name);
-
- short resFile = HOpenResFile (vRefNum, dirID, name, fsRdWrPerm);
-
- if (resFile < 0) {
- CloseResFile (resFile);
- HDelete (vRefNum, dirID, name);
- return fnfErr;
- }
-
- /* create the 'drag' resource header */
- UseResFile (resFile);
- DragResourceHeader header = (DragResourceHeader) NewHandle (sizeof (DragResourceHeaderRec));
- if (!header) {
- CloseResFile (resFile);
- HDelete (vRefNum, dirID, name);
- return memFullErr;
- }
-
- (**header).version = 0x00000001;
- (**header).reserved1 = 0;
- (**header).reserved2 = 0;
- (**header).reserved3 = 0;
- (**header).flavorCount = 0;
-
- AddResource ((Handle) header, kDragResourceResType, kDragResourceResID, "\p");
- error = ResError ();
- if (error) {
- CloseResFile (resFile);
- DisposeHandle ((Handle) header);
- HDelete (vRefNum, dirID, name);
- return error;
- }
-
- /* create the special FlyPaper data */
- auxData = (FlyPaperAuxDataHandle) NewHandle (sizeof (FlyPaperAuxDataRec));
- if (!auxData) {
- CloseResFile (resFile);
- HDelete (vRefNum, dirID, name);
- return memFullErr;
- }
-
- AddResource ((Handle) auxData, kAuxDataResType, kAuxDataResID, name);
- error = ResError ();
- if (error) {
- CloseResFile (resFile);
- HDelete (vRefNum, dirID, name);
- return error;
- }
-
- *fRefNum = resFile;
- return noErr;
- }
-
- OSErr AddFlavorToClippingFile (short clippingRefNum, FlavorType flavorType, Handle flavorData)
- {
- ST_ResFileSaver resFileSaver (CurResFile ());
-
- UseResFile (clippingRefNum);
- DragResourceHeader header = (DragResourceHeader)
- Get1Resource (kDragResourceResType, kDragResourceResID);
-
- if (!header)
- return resNotFound;
-
- DragResourceFlavorRec flavorRec;
-
- flavorRec.flavorType = flavorType;
- flavorRec.reserved1 = 0x00000100;
- flavorRec.reserved2 = 0x00000000;
- flavorRec.reserved3 = 0x00000000;
-
- AddResource (flavorData, flavorType, kFlavorResID, "\p");
- OSErr error = ResError ();
- if (error)
- return error;
-
- error = PtrAndHand (&flavorRec, (Handle) header, sizeof (flavorRec));
- if (error)
- return error;
-
- (**header).flavorCount++;
- ChangedResource ((Handle) header);
-
- return noErr;
- }
-
- OSErr OpenClippingFile (ClippingID id, short& fileRef)
- {
- fileRef = 0;
- FSSpec spec;
-
- OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
- &spec.parID);
-
- if (error)
- return error;
-
- NumToString (id, spec.name);
-
- ST_ResFileSaver resSaver (CurResFile ());
- fileRef = FSpOpenResFile (&spec, fsCurPerm);
-
- if (fileRef < 0)
- return ResError ();
- else
- return noErr;
- }
-
- OSErr GetClippingFileAuxData (ClippingID id, FlyPaperAuxDataHandle& data)
- {
- short fileRef = 0;
- ST_ResFileSaver resFileSaver (CurResFile ());
-
- OSErr error = OpenClippingFile (id, fileRef);
- if (error)
- return error;
-
- ST_ResFileCloser resFileCloser (fileRef);
-
- UseResFile (fileRef);
- data = (FlyPaperAuxDataHandle) Get1Resource (kAuxDataResType, kAuxDataResID);
- if (!data)
- return resNotFound;
-
- DetachResource ((Handle) data);
- return noErr;
- }
-
- OSErr DeleteClippingFile (ClippingID id)
- {
- FSSpec spec;
- OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
- &spec.parID);
- if (error)
- return error;
-
- NumToString (id, spec.name);
- return FSpDelete (&spec);
- }
-
-
- OSErr ClippingFileToDragReference (ClippingID id, DragReference& dragRef, Boolean loadit)
- {
- ST_ResFileSaver resFileSaver (CurResFile ());
- short fileRef;
- OSErr error = OpenClippingFile (id, fileRef);
- if (error)
- return error;
-
- ST_ResFileCloser resFileCloser (fileRef);
-
- UseResFile (fileRef);
- DragResourceHeader header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
-
- if (!header)
- return resNotFound;
-
- error = NewDrag (&dragRef);
- if (error)
- return error;
-
- ST_DragReference theDragRef (dragRef);
-
- if (!loadit) {
- error = SetDragSendProc (dragRef, gMySendDataProc, 0);
- if (error)
- return error;
- }
-
- for (unsigned short whichFlavor = 0; whichFlavor < (**header).flavorCount; ++whichFlavor) {
- FlavorType flavor;
- Handle flavorHandle;
-
- flavor = (**header).flavors [whichFlavor].flavorType;
- if (loadit) {
- // TempGet1Resource returns a tempmem handle, not a resource handle
- ST_Handle flavorHandle = TempGet1Resource (flavor, kFlavorResID);
- if ((Handle) flavorHandle == nil) {
- return resNotFound;
- }
-
- error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, *(Handle)flavorHandle,
- GetHandleSize ((Handle) flavorHandle), 0);
- if (error)
- return error;
- } else
- return memFullErr;
-
- #if 0 // Doesn't seem to work if I am bg-only. :-( error -600
- else {
- error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, nil, 1, 0);
- if (error)
- return error;
- }
- #endif
-
- }
-
- if (error == noErr) {
- theDragRef.Forget ();
- return noErr;
- } else {
- return error;
- }
- }
-
- OSErr ExtractFlavorFromClippingFile (ClippingID id, FlavorType whichFlavor, Handle &outHandle)
- {
- ST_ResFileSaver resFileSaver (CurResFile ());
- short fileRef;
- OSErr error = OpenClippingFile (id, fileRef);
- if (error)
- return error;
-
- ST_ResFileCloser resFileCloser (fileRef);
-
- UseResFile (fileRef);
- DragResourceHeader header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
- if (!header)
- return resNotFound;
-
- unsigned short index;
-
- for (index = 0; index < (**header).flavorCount; ++index) {
- if ((**header).flavors [index].flavorType == whichFlavor)
- break;
- }
-
- if (index == (**header).flavorCount)
- return cantGetFlavorErr;
-
- outHandle = TempGet1Resource (whichFlavor, kFlavorResID); // not a resource handle
-
- if (outHandle == 0)
- return memFullErr;
- else {
- return noErr;
- }
- }
-
- static
- pascal OSErr ClippingSendDataProc (FlavorType theType, void *dragSendRefCon, ItemReference theItemRef,
- DragReference theDragRef)
- {
- long oldA5 = SetA5 ((long) dragSendRefCon);
- Handle data;
- OSErr error = ExtractFlavorFromClippingFile ((ClippingID) theItemRef, theType, data);
-
- if (error)
- goto Exit;
-
- long size = GetHandleSize (data);
- HLock (data);
-
- error = SetDragItemFlavorData (theDragRef, theItemRef, theType, *data, size, 0);
- DisposeHandle (data);
-
-
- Exit:
- SetA5 (oldA5);
- return error;
- }
-
- Boolean InitClippingFile (void)
- {
- gMySendDataProc = NewDragSendDataProc (ClippingSendDataProc);
- if (!gMySendDataProc)
- return false;
- else
- return true;
- }
-
-
-
-
-
-
-
-
-